﻿# -*- coding: utf-8 -*-
#!/usr/bin/python

#------------------------------------------------------------------------

## @package     physique
## \brief   	gestion de la physique (collision)
## \author  	Pierrick Troadec et Kawtar Hssain
## \date        28/12/2011
## \version     1.2
## \copyright   license BSD

#------------------------------------------------------------------------

#    Importations
#  -----------------

import piece as _piece
import couloir as _couloir

from constante import *

#   Fonctions
#  -----------------

## Gestion des collisions avec les murs
##@param ex           : position en abscisse du joueur avant deplacement
##@param ez           : position en ordonnée du joueur avant deplacement
##@param dx           : déplacement relatif en abscisse du joueur 
##@param dz           : déplacement relatif en ordonnee du joueur 
##@param deplacement  : modificateur de direction
##@param batiment     : liste des piece du batiment
##@param listeCouloir : liste des couloirs du batiment 
##@return :
#   - 0 en cas de collision
#   - 1 sinon
def testerDeplacement(ex, ez, dx, dz, deplacement, batiment, listeCouloir):
    
    #calcul de la position du joueur apres deplacement
    x = ex + deplacement*dx
    z = ez + deplacement*dz
    
    #determination de la piece (si elle existe) dans le but d'effectuer les calculs de collisions
    num = _piece.numPiece(ex, ez, batiment)
    if(num!=99):
        piece = batiment[num]
    
        #collision mur nord
        
        
        if piece["portes"]&1 and piece["listePorte"][0] != None:  
        #avec porte
            if piece["listePorte"][0]["ouverte"]:
                #porte ouverte
                if (( x > piece["position"][0] +1) and ( z > piece["position"][2] + piece["longueur"])) or (( x < piece["position"][0] -1) and ( z > piece["position"][2] + piece["longueur"])):
                    return 0
                #porte ferme
            else:
                if ( z > piece["position"][2] + piece["longueur"]):
                    return 0
        #sans porte     
        else:                  
            if ( z > piece["position"][2] + piece["longueur"]):
                return 0
        
        #collision mur sud
        
        if piece["portes"]>>1&1 and piece["listePorte"][1] != None:
        #avec porte
            if piece["listePorte"][1]["ouverte"]:
                #porte ouverte
                if (( x > piece["position"][0] +1) and ( z < piece["position"][2])) or (( x < piece["position"][0] -1) and ( z < piece["position"][2] )):
                    return 0
                #porte ferme
            else:                    
                if ( z < piece["position"][2]):
                    return 0
        else:                    
            if ( z < piece["position"][2]):
                return 0
                
        #collision mur est
        
        if piece["portes"]>>2&1 and piece["listePorte"][2] != None:
        #avec porte
            if piece["listePorte"][2]["ouverte"]:
                #porte ouverte
                if ((z > piece["position"][2] + piece["longueur"]/2 +1) and (x < piece["position"][0] - piece["largeur"]/2)) or ((z < piece["position"][2] + piece["longueur"]/2 - 1) and (x < piece["position"][0] - piece["largeur"]/2)):
                    return 0
                #porte ferme
            else:                   
                if x < piece["position"][0] - piece["largeur"]/2:
                    return 0
        #sans porte 
        else:                   
            if x < piece["position"][0] - piece["largeur"]/2:
                return 0
        
        
        #collision mur ouest
        
        if piece["portes"]>>3&1 and piece["listePorte"][3] != None:
        #avec porte
            if piece["listePorte"][3]["ouverte"]:
                #porte ouverte
                if ((z > piece["position"][2] + piece["longueur"]/2 +1) and (x > piece["position"][0] + piece["largeur"]/2)) or ((z < piece["position"][2] + piece["longueur"]/2 - 1) and (x > piece["position"][0] + piece["largeur"]/2)):
                    return 0
                #porte ferme
            else:                   
                if x > piece["position"][0] + piece["largeur"]/2:
                    return 0
        #sans porte 
        else:                   
            if x > piece["position"][0] + piece["largeur"]/2:
                return 0
    
    #determination du couloir (si elle existe) dans le but d'effectuer les calculs de collisions
    num = _couloir.numCouloir(ex, ez, listeCouloir)
    if(num!=99):
        couloir = listeCouloir[num]
        #le couloir est oriente nord-sud
        if couloir["flag"] == VERTICAL:
            if( (x>couloir["position"][0]) or ( x<couloir["position"][0] - couloir["largeur"])):
                return 0
        #le couloir est oriente est-ouest
        if couloir["flag"] == HORIZONTAL:
            if( (z>couloir["position"][2] ) or ( z<couloir["position"][2] - couloir["largeur"])):
                return 0
                
    return 1
